package com.gupaoedu.spring.pattern.proxy.jdk;

import com.gupaoedu.spring.pattern.proxy.staticed.Person;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.lang.reflect.Proxy;

public class JDKProxyTest {


    public static void main(String[] args) {

        try{

            Person obj = (Person)new JDKMeiPo().getInstance(new XieMu());

            System.out.println(obj.getClass());

            obj.findJob();

            /**
             *
             *  原理：
             *  1、拿到被代理对象的引用，并且获取到它的所有的接口，反射获取
             *
             *  2、JDK Proxy类重新生成一个新的类，同时新的类要实现   被代理类所实现 的所有的接口
             *
             *  3、动态生成Java代码，把新加的业务逻辑方法由一定的逻辑代码区调用 （在代码中体现）
             *
             *  4、编译新生成的Java代码 .calss
             *
             *  5、再重新加载到 JVM 中运行
             *
             *  以上这个过程就叫字节码重组
             *
             *  另外：JDK 中有个规范：只要是以 $ 开头的一般都是自动生成的类
             *
             *
             */

            // 可以通过反编译工具可以查看字节码重组
            byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy",new Class[]{Person.class});
            FileOutputStream os = new FileOutputStream("E://study//$Proxy.class");
            os.write(bytes);
            os.close();



        }catch (Exception e){

            e.printStackTrace();
        }
    }
}
